ICTSC2019 一次予選 問題解説: 監視できない!

問題名  

監視できない!

問題文  

あなたは新しくkubernetesのクラスタを構築しました。そして、クラスタの情報を取得するためにnotifierというアプリケーションを作りました。このアプリケーションは自身がデプロイされたクラスタのPodに関するイベントを外部のサーバにwebhookする機能を持っています。

さて、そのアプリケーションをデプロイしてRunningと表示されるのですが、なぜかイベントを見ることが出来ません。なんとかしてイベントを見れるようにしてください。

条件  

  1. notifierのイメージを変更してはいけない。
  2. notifierはkubernetesの内部に設置する必要がある。
  3. default namespaceに別のPodをデプロイする際に、デフォルトで権限を与えすぎないようにする必要がある。

ゴール  

miscサーバでlocalhostにcurlすると、最新のイベントが確認できる。

各マシンの説明  

k8s  

kubernetesが動作しているマシン。kubernetesの上ではnotifierが動作している。また、/manifestsにはnotifierをデプロイする際に使用したマニフェストが保存されている。

  • IPアドレス: 192.168.0.1
  • ユーザ名: admin
  • パスワード: kkkkkkkks

misc  

Docker Registryやwebappなどが動作しているマシン。

  • IPアドレス: 192.168.0.201
  • ユーザ名: admin
  • パスワード: kkkkkkkks

各アプリケーションの説明  

notifier  

kubernetes上で動作しているアプリケーション。kubernetesのPodリソースを監視し、作成, 変更, 削除があった場合には http://misc/webhook にイベント情報を飛ばす。

webapp  

misc上で動作しているWebhookを受け取るアプリケーション。notifierから受け取った最新10件のイベント情報を http://misc で公開している。

解説  

踏み台サーバを経由してmiscサーバに入りcurl http://miscを実行してみると、確かにログが1件も見えていないことが分かります。

その次に、k8sサーバに入りkubectl get podskubectl logs ${POD_NAME}等のコマンドでnotifierのログを見てみます。

条件にもある通り、default namespaceにデプロイされるコンテナに不必要な権限が与えられてしまってはいけないので、まず初めにnotifier用のService Accountを作成します。

notifierが新しく作成したService Accountを使用するようにDeploymentにも変更を加えます。

次に、このService Accountに対し、notifierで必要とされる権限を付与していきます。何度かlogを見ながら試行錯誤していくと、podsに対するlist権限とwatch権限が必要だと分かるので、その2つをnotifierに付与します

最後に想定回答を示します。


apiVersion: v1
kind: ServiceAccount
metadata:
name: notifier
namespace: default
apiVersion: apps/v1
kind: Deployment
metadata:
name: notifier
labels:
app: notifier
spec:
replicas: 1
selector:
matchLabels:
app: notifier
template:
metadata:
labels:
app: notifier
spec:
serviceAccountName: notifier
hostAliases:
ip: “192.168.0.201”
hostnames:
“misc”
containers:
name: notifier
image: misc:5000/notifier
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-watcher
rules:
apiGroups: [“”]
resources: [“pods”]
verbs: [“list”, “watch”]
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: notifier
subjects:
kind: ServiceAccount
name: notifier
namespace: default
roleRef:
kind: ClusterRole
name: pod-watcher
apiGroup: rbac.authorization.k8s.io

view raw

answer.yml

hosted with ❤ by GitHub